package com.yang.Dp.HouseRobber;

/**
 * @Author: yang
 * @Description: 你是一个专业的小偷，计划偷窃沿街的房屋，每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ，
 * 这意味着第一个房屋和最后一个房屋是紧挨着的。同时，相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入
 * 系统会自动报警
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 在不触动警报装置的情况下 ，今晚能够偷窃到的最高金额。
 * @Date: Created in 17:21 2022/8/12
 * @Modified By:
 */
public class HouseRobber2 {
}

class HouseRobber2Solution {
    public int rob(int[] nums) {
        // 和打家劫舍1的区别是本题成环了
        // 如果考虑偷取首屋就不能考虑尾屋 因为它俩是相连的
        // 分别讨论，考虑将代码抽离 然后取两种情况的最大值
        if(nums.length == 0 || nums == null){
            return 0;
        }
        if(nums.length == 1){
            return nums[0];
        }
        int result = dpRange(0, nums.length - 2, nums);
        int result2 = dpRange(1, nums.length - 1, nums);
        return Math.max(result, result2);
    }
    public int dpRange(int startIndex, int endIndex, int[] nums){
        if(startIndex == endIndex){
            return nums[startIndex];
        }
        // dp数组还是取原长度
        int[] dp = new int[nums.length];
        dp[startIndex] = nums[startIndex];
        dp[startIndex + 1] = Math.max(dp[startIndex], nums[startIndex + 1]);
        for(int i = startIndex + 2; i <= endIndex; i++){
            dp[i] = Math.max(dp[i - 1], dp[i - 2]+nums[i]);
        }
        return dp[endIndex];
    }
}
